package com.ruoyi.biz.service.impl;

import java.util.*;

import cn.dev33.satoken.stp.StpUtil;
import com.ruoyi.biz.domain.BizClass;
import com.ruoyi.biz.domain.CourseRes;
import com.ruoyi.biz.mapper.BizClassMapper;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.biz.mapper.BizCourseMapper;
import com.ruoyi.biz.domain.BizCourse;
import com.ruoyi.biz.service.IBizCourseService;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * 课程Service业务层处理
 * 
 * @author lhb
 * @date 2025-02-02
 */
@Service
public class BizCourseServiceImpl implements IBizCourseService 
{
    @Resource
    private BizCourseMapper bizCourseMapper;

    @Resource
    private BizClassMapper bizClassMapper;

    @Override
    public List<CourseRes> selectCourseList() {
        // 获取当前用户id
        long loginId;
        try {
            loginId = StpUtil.getLoginIdAsLong();
        }catch (Exception e){
            throw new RuntimeException("请先登录");
        }

        // 根据用户id多表查询
        List<BizCourse> bizCourses = bizCourseMapper.selectBizCourseListByUserId(loginId);

        // 将课程列表按年份进行划分
        HashMap<Integer, List<BizCourse>> map = new HashMap<>();
        for(int i = 0; i < bizCourses.size(); i++){
            BizCourse course = bizCourses.get(i);
            Date createTime = course.getCreateTime();
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(createTime);
            int year = calendar.get(Calendar.YEAR);
            if(!map.containsKey(year)){
                // 不存在则创建
                ArrayList<BizCourse> courses = new ArrayList<>();
                courses.add(course);
                map.put(year,courses);
            }else {
                // 存在则将课程添加到对应的年份列表中
                List<BizCourse> bizCourses1 = map.get(year);
                bizCourses1.add(course);
                map.put(year,bizCourses1);
            }
        }
        List<CourseRes> courseResList = new ArrayList<>();
        for(Map.Entry<Integer,List<BizCourse>> entry : map.entrySet()){
            Integer year = entry.getKey();
            List<BizCourse> courseList = entry.getValue();
            CourseRes courseRes = new CourseRes();
            courseRes.setYear(year + "年");
            courseRes.setList(courseList);
            courseResList.add(courseRes);
        }


        return courseResList;

    }

    /**
     * 查询课程
     * 
     * @param id 课程主键
     * @return 课程
     */
    @Override
    public BizCourse selectBizCourseById(Long id)
    {
        return bizCourseMapper.selectBizCourseById(id);
    }

    /**
     * 查询课程列表
     * 
     * @param bizCourse 课程
     * @return 课程
     */
    @Override
    public List<BizCourse> selectBizCourseList(BizCourse bizCourse)
    {
        return bizCourseMapper.selectBizCourseList(bizCourse.getCourseName(),SecurityUtils.getUserId());
    }

    /**
     * 新增课程
     * 
     * @param bizCourse 课程
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertBizCourse(BizCourse bizCourse)
    {
        bizCourse.setCreateTime(DateUtils.getNowDate());
        bizCourse.setUserId(SecurityUtils.getUserId()); // 设置创建这个课程的教师id

        BizClass bizClass = new BizClass();

        bizClass.setClassName(bizCourse.getClassName());
        String randomStr;
        while (true){
            //判断班级码是否已经存在，如果存在则重新生成
            // 生成随机五位数的字母
            randomStr = RandomStringUtils.random(5,true,false);
            BizClass bizClass1 = bizClassMapper.selectByClassNumber("'" + randomStr + "'");
            if(ObjectUtils.isEmpty(bizClass1)){
                // 不存在
                break;// 跳出循环
            }
        }
        bizClass.setClassNumber(randomStr);
        bizClass.setCreateTime(DateUtils.getNowDate());
        bizCourseMapper.insertBizCourse(bizCourse);
        bizClass.setCourseId(bizCourse.getId());


        return bizClassMapper.insertBizClass(bizClass);
    }

    /**
     * 修改课程
     * 
     * @param bizCourse 课程
     * @return 结果
     */
    @Override
    public int updateBizCourse(BizCourse bizCourse)
    {
        bizCourse.setUpdateTime(DateUtils.getNowDate());
        return bizCourseMapper.updateBizCourse(bizCourse);
    }

    /**
     * 批量删除课程
     * 
     * @param ids 需要删除的课程主键
     * @return 结果
     */
    @Override
    public int deleteBizCourseByIds(Long[] ids)
    {
        return bizCourseMapper.deleteBizCourseByIds(ids);
    }

    /**
     * 删除课程信息
     * 
     * @param id 课程主键
     * @return 结果
     */
    @Override
    public int deleteBizCourseById(Long id)
    {
        return bizCourseMapper.deleteBizCourseById(id);
    }
}
